M={}

local Log_通用 = require("通用方法集合.二次封装方法.Log").Log_通用

function M.延时(时间)
    _ENV["延迟"](时间)
end

function M.点击坐标(x, y, 延时1,延时2)
    _ENV["鼠标_随机点击"](x, y, 延时1,延时2)
end

function M.查找固定区域文字并点击(区域坐标, 查找文字, 点击延迟,是否点击,x偏移, y偏移,最大重试次数)
    -- 参数说明：
    -- 区域坐标: 查找区域坐标表 {x1, y1, x2, y2} 或 {x1=x1, y1=y1, x2=x2, y2=y2}
    -- 查找文字: 要查找的文字内容
    -- 点击延迟: 点击后的延迟时间
    -- x偏移: X轴偏移量，正数向右偏移，负数向左偏移
    -- y偏移: Y轴偏移量，正数向下偏移，负数向上偏移
    
    x偏移 = x偏移 or 0  -- 默认不偏移
    y偏移 = y偏移 or 0  -- 默认不偏移
    -- 解析区域坐标
    local 区域x1, 区域y1, 区域x2, 区域y2
    if type(区域坐标) == "table" then
        if 区域坐标[1] and 区域坐标[2] and 区域坐标[3] and 区域坐标[4] then
            -- 数组形式: {x1, y1, x2, y2}
            区域x1, 区域y1, 区域x2, 区域y2 = 区域坐标[1], 区域坐标[2], 区域坐标[3], 区域坐标[4]
        elseif 区域坐标.x1 and 区域坐标.y1 and 区域坐标.x2 and 区域坐标.y2 then
            -- 键值对形式: {x1=x1, y1=y1, x2=x2, y2=y2}
            区域x1, 区域y1, 区域x2, 区域y2 = 区域坐标.x1, 区域坐标.y1, 区域坐标.x2, 区域坐标.y2
        else
            Log_通用("错误：区域坐标格式不正确")
            return false
        end
    else
        Log_通用("错误：区域坐标必须是table类型")
        return false
    end
    
    -- 重试查找机制：连续查找3次，每次间隔0.5秒
    local 最大重试次数 =最大重试次数 or 1
    local 重试间隔 = 200  -- 0.5秒
    
    for 重试次数 = 1, 最大重试次数 do
        local 查找结果 = _ENV["文字寻找"](区域x1, 区域y1, 区域x2, 区域y2, 3, 查找文字, "模糊", false)
        if 查找结果 then
            -- 使用全局坐标变量
            local 原始x = _ENV["坐标X"]
            local 原始y = _ENV["坐标Y"]
            
            -- 计算偏移后的点击坐标
            local 点击x = 原始x + x偏移
            local 点击y = 原始y + y偏移
            
            if 重试次数 > 1 then
                --Log_通用("第" .. 重试次数 .. "次重试成功找到文字: " .. 查找文字)-- .. "，原始坐标: (" .. 原始x .. "," .. 原始y .. ")，偏移后坐标: (" .. 点击x .. "," .. 点击y .. ")")
            else
                --Log_通用("找到文字: " .. 查找文字)-- .. "，原始坐标: (" .. 原始x .. "," .. 原始y .. ")，偏移后坐标: (" .. 点击x .. "," .. 点击y .. ")")
            end
            
            if 是否点击 then
                _ENV["鼠标_随机点击"](点击x, 点击y, 1, 1)
                _ENV["延迟"](点击延迟)
                --Log_通用("已点击偏移位置")
            else
                --Log_通用("找到文字但未点击")
            end
            return true
        else
            if 重试次数 < 最大重试次数 then
                --Log_通用("第" .. 重试次数 .. "次未找到: " .. 查找文字 .. "，等待" .. (重试间隔/1000) .. "秒后重试...")
                _ENV["延迟"](重试间隔)
            else
                --Log_通用("连续" .. 最大重试次数 .. "次查找都未找到文字: " .. 查找文字 .. "，确认找不到了")
            end
        end
    end
    
    -- 所有重试都失败，返回false
    return false
end

function M.查找固定区域文字并返回坐标(区域坐标, 查找文字)
    -- 参数说明：
    -- 区域坐标: 查找区域坐标表 {x1, y1, x2, y2} 或 {x1=x1, y1=y1, x2=x2, y2=y2}
    -- 查找文字: 要查找的文字内容
    
    -- 解析区域坐标
    local 区域x1, 区域y1, 区域x2, 区域y2
    if type(区域坐标) == "table" then
        if 区域坐标[1] and 区域坐标[2] and 区域坐标[3] and 区域坐标[4] then
            -- 数组形式: {x1, y1, x2, y2}
            区域x1, 区域y1, 区域x2, 区域y2 = 区域坐标[1], 区域坐标[2], 区域坐标[3], 区域坐标[4]
        elseif 区域坐标.x1 and 区域坐标.y1 and 区域坐标.x2 and 区域坐标.y2 then
            -- 键值对形式: {x1=x1, y1=y1, x2=x2, y2=y2}
            区域x1, 区域y1, 区域x2, 区域y2 = 区域坐标.x1, 区域坐标.y1, 区域坐标.x2, 区域坐标.y2
        else
            Log_通用("错误：区域坐标格式不正确")
            return false
        end
    else
        Log_通用("错误：区域坐标必须是table类型")
        return false
    end
    
    -- 重试查找机制：连续查找3次，每次间隔0.5秒
    local 最大重试次数 = 1
    local 重试间隔 = 500  -- 0.5秒
    
    for 重试次数 = 1, 最大重试次数 do
        local 查找结果 = _ENV["文字寻找"](区域x1, 区域y1, 区域x2, 区域y2, 3, 查找文字, "模糊", false)
        if 查找结果 then
            -- 使用全局坐标变量
            local 原始x = _ENV["坐标X"]
            local 原始y = _ENV["坐标Y"]
            
            if 重试次数 > 1 then
                Log_通用("第" .. 重试次数 .. "次重试成功找到文字: " .. 查找文字 .. "，坐标: (" .. 原始x .. "," .. 原始y .. ")")
            else
                Log_通用("找到文字: " .. 查找文字 .. "，坐标: (" .. 原始x .. "," .. 原始y .. ")")
            end
            
            -- 返回坐标信息
            return {
                x = 原始x,
                y = 原始y
            }
        else
            if 重试次数 < 最大重试次数 then
                Log_通用("第" .. 重试次数 .. "次查找未找到文字: " .. 查找文字 .. "，等待" .. (重试间隔/1000) .. "秒后重试...")
                _ENV["延迟"](重试间隔)
            else
                Log_通用("连续" .. 最大重试次数 .. "次查找都未找到文字: " .. 查找文字 .. "，确认找不到了")
            end
        end
    end
    
    -- 所有重试都失败，返回false
    return false
end

function M.查找固定区域数字并返回这个数字(区域坐标, 是否需要取整)
    -- 参数说明：
    -- 区域坐标: 查找区域坐标表 {x1, y1, x2, y2} 或 {x1=x1, y1=y1, x2=x2, y2=y2}
    -- 是否需要取整: 布尔值，true=返回整数，false=返回原始数值，默认为true
    if 是否需要取整 == nil then
        是否需要取整 = true  -- 默认取整
    end
    
    -- 解析区域坐标
    local 区域x1, 区域y1, 区域x2, 区域y2
    if type(区域坐标) == "table" then
        if 区域坐标[1] and 区域坐标[2] and 区域坐标[3] and 区域坐标[4] then
            -- 数组形式: {x1, y1, x2, y2}
            区域x1, 区域y1, 区域x2, 区域y2 = 区域坐标[1], 区域坐标[2], 区域坐标[3], 区域坐标[4]
        elseif 区域坐标.x1 and 区域坐标.y1 and 区域坐标.x2 and 区域坐标.y2 then
            -- 键值对形式: {x1=x1, y1=y1, x2=x2, y2=y2}
            区域x1, 区域y1, 区域x2, 区域y2 = 区域坐标.x1, 区域坐标.y1, 区域坐标.x2, 区域坐标.y2
        else
            Log_通用("错误：区域坐标格式不正确")
            return false
        end
    else
        Log_通用("错误：区域坐标必须是table类型")
        return false
    end
    
    -- 重试查找机制：连续查找3次，每次间隔0.5秒
    local 最大重试次数 = 1
    local 重试间隔 = 500  -- 0.5秒
    
    for 重试次数 = 1, 最大重试次数 do
        -- 使用文字识别获取区域内的所有文字内容
        local 识别结果 = _ENV["文字识别"](区域x1, 区域y1, 区域x2, 区域y2, 3)
        if 识别结果 and 识别结果 ~= "" then
            -- 提取数字内容（支持小数和逗号分隔符）
            local 数字内容
            if 是否需要取整 then
                -- 需要取整时，先去除逗号，再使用原有的只取整数逻辑
                local 去除逗号 = string.gsub(识别结果, ",", "")
                数字内容 = _ENV["文本_只取数字"](去除逗号)
                Log_通用("取整模式 - 原始内容: " .. 识别结果 .. ", 去除逗号后: " .. 去除逗号 .. ", 提取内容: " .. tostring(数字内容))
            else
                -- 不需要取整时，先去除逗号，再提取包含小数的数字
                local 去除逗号 = string.gsub(识别结果, ",", "")
                数字内容 = string.match(去除逗号, "[%d%.]+")
                Log_通用("小数模式 - 原始内容: " .. 识别结果 .. ", 去除逗号后: " .. 去除逗号 .. ", 提取内容: " .. tostring(数字内容))
            end
            
            if 数字内容 and 数字内容 ~= "" then
                -- 转换为数字类型
                local 数字值 = tonumber(数字内容)
                if 数字值 then
                    -- 根据参数决定是否取整
                    local 最终数字值 = 是否需要取整 and math.floor(数字值) or 数字值
                    
                    if 重试次数 > 1 then
                        Log_通用("第" .. 重试次数 .. "次重试成功识别到数字: " .. 最终数字值 .. "，原始识别内容: " .. 识别结果)
                    else
                        Log_通用("成功识别到数字: " .. 最终数字值 .. "，原始识别内容: " .. 识别结果)
                    end
                    
                    -- 返回数字值
                    return 最终数字值
                else
                    Log_通用("识别到内容但无法转换为数字: " .. 识别结果)
                end
            else
                Log_通用("识别区域内未找到数字内容: " .. 识别结果)
            end
        else
            if 重试次数 < 最大重试次数 then
                Log_通用("第" .. 重试次数 .. "次查找未识别到内容，等待" .. (重试间隔/1000) .. "秒后重试...")
                _ENV["延迟"](重试间隔)
            else
                Log_通用("连续" .. 最大重试次数 .. "次查找都未识别到内容，确认找不到了")
            end
        end
    end
    
    -- 所有重试都失败，返回false
    return false
end

function M.查找固定区域文字并返回文字(区域坐标)
    -- 参数说明：
    -- 区域坐标: 查找区域坐标表 {x1, y1, x2, y2} 或 {x1=x1, y1=y1, x2=x2, y2=y2}
    
    -- 解析区域坐标
    local 区域x1, 区域y1, 区域x2, 区域y2
    if type(区域坐标) == "table" then
        if 区域坐标[1] and 区域坐标[2] and 区域坐标[3] and 区域坐标[4] then
            -- 数组形式: {x1, y1, x2, y2}
            区域x1, 区域y1, 区域x2, 区域y2 = 区域坐标[1], 区域坐标[2], 区域坐标[3], 区域坐标[4]
        elseif 区域坐标.x1 and 区域坐标.y1 and 区域坐标.x2 and 区域坐标.y2 then
            -- 键值对形式: {x1=x1, y1=y1, x2=x2, y2=y2}
            区域x1, 区域y1, 区域x2, 区域y2 = 区域坐标.x1, 区域坐标.y1, 区域坐标.x2, 区域坐标.y2
        else
            Log_通用("错误：区域坐标格式不正确")
            return false
        end
    else
        Log_通用("错误：区域坐标必须是table类型")
        return false
    end
    
    -- 重试查找机制：连续查找3次，每次间隔0.5秒
    local 最大重试次数 = 1
    local 重试间隔 = 500  -- 0.5秒
    
    for 重试次数 = 1, 最大重试次数 do
        -- 使用文字识别获取区域内的所有文字内容
        local 识别结果 = _ENV["文字识别"](区域x1, 区域y1, 区域x2, 区域y2, 3)
        if 识别结果 and 识别结果 ~= "" then
            -- 去除首尾空白字符
            local 文字内容 = string.match(识别结果, "^%s*(.-)%s*$")
            
            if 文字内容 and 文字内容 ~= "" then
                if 重试次数 > 1 then
                    Log_通用("第" .. 重试次数 .. "次重试成功识别到文字: " .. 文字内容)
                else
                    Log_通用("成功识别到文字: " .. 文字内容)
                end
                
                -- 返回文字内容
                return 文字内容
            else
                Log_通用("识别区域内未找到有效文字内容: " .. 识别结果)
            end
        else
            if 重试次数 < 最大重试次数 then
                Log_通用("第" .. 重试次数 .. "次查找未识别到内容，等待" .. (重试间隔/1000) .. "秒后重试...")
                _ENV["延迟"](重试间隔)
            else
                Log_通用("连续" .. 最大重试次数 .. "次查找都未识别到内容，确认找不到了")
            end
        end
    end
    
    -- 所有重试都失败，返回false
    return false
end

function M.图色_多点找色(x1, y1, x2, y2, color, sim, 方向, 点击)
    -- 参数说明：
    -- x1, y1, x2, y2: 查找区域坐标
    -- color: 颜色数组 {颜色字符串1, 颜色字符串2}
    -- sim: 相似度阈值
    -- 方向: 查找方向
    -- 点击: 是否点击找到的位置
    
    -- 调用原始的多点找色函数
    _ENV["坐标X"], _ENV["坐标Y"] = findMultiColor(x1, y1, x2, y2, color[1], color[2], 方向, sim)
    
    Log_通用("多点找色结果 - 坐标X: " .. _ENV["坐标X"] .. ", 坐标Y: " .. _ENV["坐标Y"])
    
    if _ENV["坐标X"] > 1 then
        if 点击 then
            _ENV["鼠标_随机点击"](_ENV["坐标X"], _ENV["坐标Y"], 800, 1200)
            Log_通用("多点找色成功并已点击，坐标: (" .. _ENV["坐标X"] .. "," .. _ENV["坐标Y"] .. ")")
        else
            Log_通用("多点找色成功但未点击，坐标: (" .. _ENV["坐标X"] .. "," .. _ENV["坐标Y"] .. ")")
        end
        return true
    else
        Log_通用("多点找色失败，未找到匹配的颜色")
        return false
    end
end

return M